#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/************************************************************************/
/*                                                                      */
/************************************************************************/

/************************************************************************
原型: int atoi(const char *nptr);

函数说明: 参数nptr字符串，如果第一个非空格字符不存在或者不是数字也不是正负号则返回零，
          否则开始做类型转换，之后检测到非数字(包括结束符 \0) 字符时停止转换，返回整型数。
************************************************************************/
int atoi(const char* str)
{
    int value = 0;
    int flag = 1; //判断符号
    while (*str == ' ')  //跳过字符串前面的空格
    {
        str++;
    }
    if (*str == '-')  //第一个字符若是‘-’，说明可能是负数
    {
        flag = 0;
        str++;
    }
    else if (*str == '+') //第一个字符若是‘+’，说明可能是正数
    {
        flag = 1;
        str++;
    }//第一个字符若不是‘+’‘-’也不是数字字符，直接返回0
    else if (*str > '9' || *str < '0') 
    {
        return 0;    
    }
    //当遇到非数字字符或遇到‘\0’时，结束转化
    while (*str != '\0' && *str <= '9' && *str >= '0')
    {
        value = value * 10 + *str - '0'; //将数字字符转为对应的整形数
        str++;
    }
    if (flag == 0) //负数的情况
    {
        value = -value;
    }
    return value;
} 

/************************************************************************/
/*                                                                      */
/************************************************************************/

int main(int argc, char* argv[])
{
    int val;
    char str[20];

    strcpy(str, "123456789");
    val = atoi(str);
    printf("字符串值 = %s, 整型值 = %d\n", str, val);
    
    strcpy(str, "-321654987");
    val = atoi(str);
    printf("字符串值 = %s, 整型值 = %d\n", str, val);
    
    strcpy(str, "helloworld");
    val = atoi(str);
    printf("字符串值 = %s, 整型值 = %d\n", str, val);
    
    strcpy(str, "123helloworld");
    val = atoi(str);
    printf("字符串值 = %s, 整型值 = %d\n", str, val);

    return 0;
}